package calvin.study.rabbitmq.simple.simple_topic;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.MessageProperties;
/**
 * 主题模式交换机(模糊匹配)
 *	 所有发送到Topic Exchange 的消息被转发到所有关心RouteKey指定Topic的Queue上
 *	 Exchange将RouteKey和某Topic进行模糊匹配，此时队列需要绑定到一个Topic
 *
 *注意：可以使用通配符进行模糊匹配
		符号"#"匹配一个或多个词 	例如“log.#” 能够匹配到“log.info.oa”
		符号"*"匹配不多不少一个词 	例如“log.*” 能够匹配到“log.error”
 * @author wh
 *
 */
public class Producer {

	public static void main(String[] args) {
		// 创建连接工厂
		ConnectionFactory connectionFactory = new ConnectionFactory();
		connectionFactory.setHost("10.4.8.128");
		connectionFactory.setPort(5672);
		connectionFactory.setVirtualHost("test");

		Connection conn = null;
		Channel channel = null;
		try {
			// 创建连接
			conn = connectionFactory.newConnection("生产者");
			// 通过连接获取通道
			channel = conn.createChannel();
			
			String queueName = "simple_queuq1";
			/**
			 * 声明一个队列
			 * @param queue      队列名称
			 * @param durable    是否需要持久化（存盘） 服务宕机或重启。 非持久化队列也会存盘，但服务器宕机或重启 数据会丢失
			 * @param exclusive  排他性，是否是独占独立
			 * @param autoDelete 是否自动删除 随着最后一个消费者消息完毕以后，是否把队列自动删除
			 * @param arguments  携带一些附加参数 如超时时间 ...
			 */
			channel.queueDeclare(queueName, true, false, false, null);
			
			String routingkey1 = "weixin.notice.send";
			String routingkey2 = "weixin.pay.send";
			String routingkey3 = "weixin.send";
			
			String msg = "这是一条微信通知";
			channel.basicPublish("topic_exchange", routingkey1, MessageProperties.PERSISTENT_TEXT_PLAIN, msg.getBytes());
			channel.basicPublish("topic_exchange", routingkey2, MessageProperties.PERSISTENT_TEXT_PLAIN, msg.getBytes());
			channel.basicPublish("topic_exchange", routingkey3, MessageProperties.PERSISTENT_TEXT_PLAIN, msg.getBytes());
			System.out.println("消息发送成功：" + msg);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				channel.close();
				conn.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (TimeoutException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

}
